package com.atguigu.spzx.common.handler;

import com.atguigu.spzx.model.common.Result;
import com.atguigu.spzx.model.exception.SpzxException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

//异常处理方法返回结果会被转为json
@RestControllerAdvice
@Slf4j
//异常处理方法返回转发或重定向视图
//@ControllerAdvice
public class SpzxGlobalExceptionHandler {
    //最大异常的处理器
    @ExceptionHandler(value = Exception.class)
    public Result exception(Exception e){
        if(e!=null){
            log.error("出现异常:{}" , ExceptionUtils.getStackTrace(e));
        }
        return Result.fail();
    }
    //希望异常处理器捕获异常后
    //给前端提示的Result对象的code 和message能够精确描述异常，前端进行友好提示
    //如果异常处理器捕获到的异常中 包含了我们需要的code和message值，我们使用它们创建Result对象返回
    // 解决：使用自定义异常类 对异常进行扩展(携带code和message和发生的原异常对象)
    @ExceptionHandler(value = SpzxException.class)
    public Result exception(SpzxException e){
        if(e.getE()!=null){
            //如果原始异常对象不为空 打印堆栈日志
            log.error("出现异常:{}" , ExceptionUtils.getStackTrace(e));
        }
        return Result.fail().code(e.getCode()).message(e.getMessage());
    }
}
